import sensor, image, time, pyb
import seekfree                         # 包括中继模块的库

sensor.reset()                          # 摄像头复位
sensor.set_pixformat(sensor.RGB565)     # 设置色彩类型
sensor.set_framesize(sensor.QVGA)       # 设置图像分辨率，可设置为QQVGA（160*120）和QVGA（320*240）
sensor.set_auto_exposure(1, 150)        # 设置曝光，通过曝光来控制亮度，第一个参数是是否自动亮度，0为关闭自动亮度，1为开启自动亮度
                                        # 第二个参数是亮度值，自动亮度下，范围为0-255，手动亮度下，范围为0-65535，值越大越亮
sensor.skip_frames(time = 200)          # 设置完成后跳过一定的帧数，确保设置完成

sensor.set_auto_whitebal(1, (0, 0, 0))  # 设置自动白平衡，第一个参数是是否自动白平衡，0为关闭自动白平衡，1为开启自动白平衡
                                        # 第二个参数为白平衡参数，自动白平衡下无效，分别对应（r，g，b），范围0-255，值越大，画面越偏向对应的颜色
sensor.skip_frames(time = 200)          # 设置完成后跳过一定的帧数，确保设置完成

clock = time.clock()


# 中继模块发送命令函数

# command参数包括
# APPLY_IMAGE       申请图片
# APPLY_MORE_IMAGE  申请更多图片（执行一次申请图片后生效）
# REPORT_RESULT     发送结果
# LED_CONTORL       控制中继模块的补光灯

# 如果command参数为REPORT_RESULT，则result_str为结果字符串
# 如果command参数为LED_CONTORL，则result_str为”1“打开补光灯，为”0“关闭补光灯
# 函数返回0则表示命令成功，其他则为失败
def relay_camera_send(command, result_str = ""):
    relay_camera_opt = seekfree.relay_camera()                      # 初始化中继模块对象

    if command == "APPLY_IMAGE":                                    # 申请图片命令
        relay_camera_res = relay_camera_opt.apply_image()

    if command == "APPLY_MORE_IMAGE":                               # 申请更多图片命令
        relay_camera_res = relay_camera_opt.apply_more_image()

    if command == "REPORT_RESULT":                                  # 返回结果命令
        relay_camera_res = relay_camera_opt.report_result(result_str)

    if command == "LED_CONTORL":                                    # 控制补光灯命令
        if result_str == "1":
            relay_camera_res = relay_camera_opt.led(1)
        if result_str == "0":
            relay_camera_res = relay_camera_opt.led(0)
    return relay_camera_res


# 用于测试命令发送
TG_TS = True                                                        # True是获取图像，False是发送结果
REQ_IMAGE_COUNT = -1                                                # 最大申请10张，执行了APPLY_IMAGE才能开始申请更多图片, -1表示还没有执行APPLY_IMAGE
REQ_RESULT = 0                                                      # 申请结果

def tick(s):                                                        # 定义一个需要周期运行的函数
    global TG_TS, REQ_IMAGE_COUNT, REQ_RESULT


    if TG_TS:
        if REQ_IMAGE_COUNT >= 10:                                   # 超过10张则退出,最大申请的数量可以根据实际红色方块修改，中继模块也需要同步修改
            return
        if pyb.rng() % 10 <= 2 or REQ_IMAGE_COUNT == -1:            # 申请图片
            REQ_RESULT = relay_camera_send("APPLY_IMAGE")
            if REQ_IMAGE_COUNT == -1:
                REQ_IMAGE_COUNT = 0

            REQ_IMAGE_COUNT = REQ_IMAGE_COUNT + 1                   # 申请图片数量加1
            print(f"APPLY_IMAGE_COUNT = {REQ_IMAGE_COUNT}")
        else:                                                       # 申请图片
            REQ_RESULT = relay_camera_send("APPLY_MORE_IMAGE")      # 运行申请更多图片
            print(f"APPLY_MORE_IMAGE")
        TG_TS = False
    else:
        if REQ_RESULT == 0:
            relay_camera_send("REPORT_RESULT", "seekfree")          # 返回结果
        else:
            print("REQ_IMAGE FAILURE")
        TG_TS = True


seekfree.init()                                                     # 在创建定时器前务必调用此函数进行初始化
tim = seekfree.Timer(1, 2000)                                       # 创建一个定时器 1：定时器通道（可设置1-128） 2000：定时器每2000ms触发并调用一次回调函数
tim.callback(tick)                                                  # 设置定时器的回调函数

relay_camera_send("LED_CONTORL", "1")                               # 打开中继模块补光灯

while(True):
    clock.tick()
    img = sensor.snapshot()
    #print(clock.fps())

